﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Input;

namespace VKCT
{
    public partial class MainForm : Form
    {

        //窗体不获焦
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams ret = base.CreateParams;
                ret.ExStyle |= (int)WindowStyles.WS_EX_NOACTIVATE | (int)WindowStyles.WS_EX_TOOLWINDOW;
                ret.Parent = IntPtr.Zero;
                return ret;
            }
        }


        //模拟键盘API  和上面的API参数类型有区别   键值用Keys，大部分准确
        [DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]
        public static extern void keybd_event0(int bVk, byte bScan, uint dwFlags, uint dwExtraInfo);

        //模拟键盘API  和上面的API参数类型有区别   键值用Keys，大部分准确
        [DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]
        public static extern void keybd_event1(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);


        //模拟键盘API  和上面的API参数类型有区别   键值用Keys，大部分准确
        [DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]
        public static extern void keybd_event(Keys bVk, byte bScan, uint dwFlags, uint dwExtraInfo);

        #region 切换开关
        private int state = 1;
        private void btnSwitch_Click(object sender, EventArgs e)
        {
            if (state == 0)
            {
                state = 1;
            }
            else
            {
                state = 0;
            }
            foreach (Control c in this.Controls)
            {
                Panel p = c as Panel;
                if (p != null)
                {
                    foreach (Control cc in p.Controls)
                    {
                        Button c_btn = cc as Button;
                        if (c_btn != null && "切换" != c_btn.Text)
                        {
                            if (c_btn.Text.Contains(" "))
                            {
                                c_btn.Tag = c_btn.Text;
                            }
                            c_btn.Text = c_btn.Tag.ToString().Split(' ')[state];
                        }
                    }
                }
            }
        }
        #endregion

        
        #region CapsLock按键
        bool isCapitalization = false; //是否大写，默认小写
        private void CapsLock_Click(object sender, EventArgs e)
        {
            const int KEYEVENTF_EXTENDEDKEY = 0x1;
            const int KEYEVENTF_KEYUP = 0x2;
            keybd_event1(0x14, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
            keybd_event1(0x14, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
            if (!isCapitalization)
            {
                isCapitalization = true;
                this.btnCapsLock.BackColor = Color.Blue;
            }
            else
            {
                isCapitalization = false;
                this.btnCapsLock.BackColor = Control.DefaultBackColor;
            }
            //下面2行代码同样可以做到 系统全局-大小写
            //keybd_event(Keys.CapsLock,0,0,0);
            //keybd_event(Keys.CapsLock, 0, 2, 0);
        }
        #endregion


        #region windows键
        private void LWin_Click(object sender, EventArgs e)
        {
            keybd_event(Keys.LWin, 0, 0, 0);
            keybd_event(Keys.LWin, 0, 2, 0);
        }
        #endregion

        
        public MainForm()
        {
            InitializeComponent();
        }


        private void MainForm_Load(object sender, EventArgs e)
        {
            btnSwitch_Click(null, null);
            foreach (Control c in this.Controls)
            {
                Panel p = c as Panel;
                if (p != null)
                {
                    foreach (Control cc in p.Controls)
                    {
                        Button c_btn = cc as Button;
                        if (c_btn != null && "切换" != c_btn.Text && !c_btn.Text.Contains("CapsLock") && !c_btn.Text.Contains("Win")
                             && !c_btn.Text.Contains("Ctrl") && !c_btn.Text.Contains("Shift") && !c_btn.Text.Contains("Alt"))
                        {
                            c_btn.Click += new EventHandler(btn_Click);
                        }
                        if (c_btn != null && (c_btn.Text.Contains("Ctrl") || c_btn.Text.Contains("Shift") || c_btn.Text.Contains("Alt")) )
                        {
                            c_btn.Click += new EventHandler(btn1_Click);
                        }
                    }
                }
            }
        }
        private void btn_Click(object sender, EventArgs e) {
            Button btn = (Button)sender;
            int keycode = Convert.ToInt32(btn.Tag.ToString().Split(' ')[1]);
            keybd_event0(keycode, 0, 0, 0);
            keybd_event0(keycode, 0, 2, 0);
            
            //
            foreach (Control c in this.Controls)
            {
                Panel p = c as Panel;
                if (p != null)
                {
                    foreach (Control cc in p.Controls)
                    {
                        Button c_btn = cc as Button;
                        if (c_btn != null && (c_btn.Tag.ToString().Contains("Ctrl") || c_btn.Tag.ToString().Contains("Shift") || c_btn.Tag.ToString().Contains("Alt") || c_btn.Tag.ToString().Contains("Win")))
                        {
                            if (c_btn.BackColor == Color.Blue) {
                                int code = Convert.ToInt32(c_btn.Tag.ToString().Split(' ')[1]);
                                keybd_event0(code, 0, 2, 0);
                                c_btn.BackColor = Control.DefaultBackColor;
                            }
                        }
                    }
                }
            }
        }


        private void btn1_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;
            int keycode = Convert.ToInt32(btn.Tag.ToString().Split(' ')[1]);

            keybd_event0(keycode, 0, 0, 0);
            btn.BackColor = Color.Blue;
        }



        //#region Escape监听
        //private void btnESC_Click(object sender, EventArgs e)
        //{
        //    keybd_event(Keys.Escape, 0, 0, 0);
        //}
        //#endregion

        //#region F1-F12  虚拟键统一监听
        //private void FnClick(object sender, EventArgs e)
        //{
        //    string fn = ((Button)sender).Text;
        //    switch (fn)
        //    {
        //        case "F1":
        //            keybd_event(Keys.F1, 0, 0, 0);
        //            break;
        //        case "F2":
        //            keybd_event(Keys.F2, 0, 0, 0);
        //            break;
        //        case "F3":
        //            keybd_event(Keys.F3, 0, 0, 0);
        //            break;
        //        case "F4":
        //            keybd_event(Keys.F4, 0, 0, 0);
        //            break;
        //        case "F5":
        //            keybd_event(Keys.F5, 0, 0, 0);
        //            break;
        //        case "F6":
        //            keybd_event(Keys.F6, 0, 0, 0);
        //            break;
        //        case "F7":
        //            keybd_event(Keys.F7, 0, 0, 0);
        //            break;
        //        case "F8":
        //            keybd_event(Keys.F8, 0, 0, 0);
        //            break;
        //        case "F9":
        //            keybd_event(Keys.F9, 0, 0, 0);
        //            break;
        //        case "F10":
        //            keybd_event(Keys.F10, 0, 0, 0);
        //            break;
        //        case "F11":
        //            keybd_event(Keys.F11, 0, 0, 0);
        //            break;
        //        case "F12":
        //            keybd_event(Keys.F12, 0, 0, 0);
        //            break;
        //    }
        //}
        //#endregion

        //#region 数字键   多个虚拟数字键按钮-统一监听
        //private void NUmberClick(object sender, EventArgs e)
        //{
        //    int number = Convert.ToInt32(((Button)sender).Text); //0 1 2 3 4 5 6 7 8 9
        //    switch (number)
        //    {
        //        case 0:
        //            keybd_event(Keys.D0, 0, 0, 0);
        //            break;
        //        case 1:
        //            keybd_event(Keys.D1, 0, 0, 0);
        //            break;
        //        case 2:
        //            keybd_event(Keys.D2, 0, 0, 0);
        //            break;
        //        case 3:
        //            keybd_event(Keys.D3, 0, 0, 0);
        //            break;
        //        case 4:
        //            keybd_event(Keys.D4, 0, 0, 0);
        //            break;
        //        case 5:
        //            keybd_event(Keys.D5, 0, 0, 0);
        //            break;
        //        case 6:
        //            keybd_event(Keys.D6, 0, 0, 0);
        //            break;
        //        case 7:
        //            keybd_event(Keys.D7, 0, 0, 0);
        //            break;
        //        case 8:
        //            keybd_event(Keys.D8, 0, 0, 0);
        //            break;
        //        case 9:
        //            keybd_event(Keys.D9, 0, 0, 0);
        //            break;
        //    }
        //}
        //#endregion

        //#region Ctrl 是否按下
        //bool isCtrl = false;
        //private void CtrlClick(object sender, EventArgs e)
        //{
        //    if (!isCtrl)
        //    {
        //        isCtrl = true;
        //        this.btnLeftCtrl.BackColor = Color.Blue;
        //        this.btnRightCtrl.BackColor = Color.Blue;
        //    }
        //    else
        //    {
        //        isCtrl = false;
        //        this.btnLeftCtrl.BackColor = Control.DefaultBackColor;
        //        this.btnRightCtrl.BackColor = Control.DefaultBackColor;
        //    }
        //}
        //#endregion



        //#region 字母键，组合键   多个虚拟字母键按钮-统一监听
        //private void CharClick(object sender, EventArgs e)
        //{
        //    String cr = ((Button)sender).Text;
        //    switch (cr)
        //    {
        //        case "a":
        //            if (isCtrl)
        //            { //组合键 ctrl + a   示例：其它组合键，自行摸索
        //                keybd_event(Keys.ControlKey, 0, 0, 0);
        //                keybd_event(Keys.A, 0, 0, 0);
        //                keybd_event(Keys.ControlKey, 0, 2, 0);
        //                keybd_event(Keys.A, 0, 2, 0);
        //            }
        //            else
        //            {
        //                keybd_event(Keys.A, 0, 0, 0);
        //            }
        //            break;
        //        case "b":
        //            keybd_event(Keys.B, 0, 0, 0);
        //            break;
        //        case "c":
        //            keybd_event(Keys.C, 0, 0, 0);
        //            break;
        //        case "d":
        //            keybd_event(Keys.D, 0, 0, 0);
        //            break;
        //        case "e":
        //            keybd_event(Keys.E, 0, 0, 0);
        //            break;
        //        case "f":
        //            keybd_event(Keys.F, 0, 0, 0);
        //            break;
        //        case "g":
        //            keybd_event(Keys.G, 0, 0, 0);
        //            break;
        //        case "h":
        //            keybd_event(Keys.H, 0, 0, 0);
        //            break;
        //        case "i":
        //            keybd_event(Keys.I, 0, 0, 0);
        //            break;
        //        case "j":
        //            keybd_event(Keys.J, 0, 0, 0);
        //            break;
        //        case "k":
        //            keybd_event(Keys.K, 0, 0, 0);
        //            break;
        //        case "l":
        //            keybd_event(Keys.L, 0, 0, 0);
        //            break;
        //        case "m":
        //            keybd_event(Keys.M, 0, 0, 0);
        //            break;
        //        case "n":
        //            keybd_event(Keys.N, 0, 0, 0);
        //            break;
        //        case "o":
        //            keybd_event(Keys.O, 0, 0, 0);
        //            break;
        //        case "p":
        //            keybd_event(Keys.P, 0, 0, 0);
        //            break;
        //        case "q":
        //            keybd_event(Keys.Q, 0, 0, 0);
        //            break;
        //        case "r":
        //            keybd_event(Keys.R, 0, 0, 0);
        //            break;
        //        case "s":
        //            keybd_event(Keys.S, 0, 0, 0);
        //            break;
        //        case "t":
        //            keybd_event(Keys.T, 0, 0, 0);
        //            break;
        //        case "u":
        //            keybd_event(Keys.U, 0, 0, 0);
        //            break;
        //        case "v":
        //            keybd_event(Keys.V, 0, 0, 0);
        //            break;
        //        case "w":
        //            keybd_event(Keys.W, 0, 0, 0);
        //            break;
        //        case "x":
        //            keybd_event(Keys.X, 0, 0, 0);
        //            break;
        //        case "y":
        //            keybd_event(Keys.Y, 0, 0, 0);
        //            break;
        //        case "z":
        //            keybd_event(Keys.Z, 0, 0, 0);
        //            break;
        //    }
        //}
        //#endregion



        //#region 右边符号键 统一监听 未完成全部代码
        //private void LeftOtherClick(object sender, EventArgs e)
        //{
        //    String otherChar = ((Button)sender).Text;
        //    switch (otherChar)
        //    {
        //        case "Backspace":
        //            keybd_event(Keys.Back, 0, 0, 0);
        //            break;
        //        case "Enter":
        //            keybd_event(Keys.Enter, 0, 0, 0);
        //            break;
        //        case "Space":
        //            keybd_event(Keys.Space, 0, 0, 0);
        //            break;
        //            //case "#":
        //            //    break;
        //            //case "$":
        //            //    break;
        //            //case "%":
        //            //    break;
        //            //case "^":
        //            //    break;
        //            //case "&&":
        //            //    break;
        //            //case "*":
        //            //    break;
        //            //case "(":
        //            //    break;
        //            //case ")":
        //            //    break;
        //            //case "":
        //            //    break;
        //            //case "":
        //            //    break;
        //            //todo   other

        //    }
        //}
        //#endregion

        ////除了调用 user32.dll 实现模拟按键外，还有另外一种 SendKeys
        ////组合键：Ctrl = ^    Shift = +    Alt = %
        //private void button1_Click(object sender, EventArgs e)
        //{
        //    //括号中的内容就是虚拟按键的内容，可以有如下值：
        //    //ENTER  BACKSPACE  END  HOME  DELETE   +   -   *   /   \\     等...
        //    SendKeys.Send("^+");  //ctrl + shift     由于用上面的user32.dll 我没解决 ctrl +shift组合键的问题，所以这里可以解决
        //    //SendKeys.Send("a"); //a  区分大小写
        //    //SendKeys.Send("^{A}");  //ctrl + A
        //}
    }
}
